/* Copyright (c) 2010, Carl Burch. License information is located in the
 * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */

package com.cburch.logisim.gui.menu;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JMenuItem;

class MenuItemHelper implements ActionListener {
    private JMenuItem source;
    private LogisimMenuItem menuItem;
    private Menu menu;
    private boolean enabled;
    private boolean inActionListener;
    private ArrayList<ActionListener> listeners;

    public MenuItemHelper(JMenuItem source, Menu menu, LogisimMenuItem menuItem) {
        this.source = source;
        this.menu = menu;
        this.menuItem = menuItem;
        this.enabled = true;
        this.inActionListener = false;
        this.listeners = new ArrayList<ActionListener>();
    }

    public boolean hasListeners() {
        return !listeners.isEmpty();
    }

    public void addActionListener(ActionListener l) {
        listeners.add(l);
        computeEnabled();
    }

    public void removeActionListener(ActionListener l) {
        listeners.remove(l);
        computeEnabled();
    }

    public void setEnabled(boolean value) {
        if (!inActionListener) {
            enabled = value;
        }
    }

    private void computeEnabled() {
        inActionListener = true;
        try {
            source.setEnabled(enabled);
            menu.computeEnabled();
        } finally {
            inActionListener = false;
        }
    }

    @Override
    public void actionPerformed(ActionEvent event) {
        if (!listeners.isEmpty()) {
            ActionEvent e = new ActionEvent(menuItem, event.getID(),
                    event.getActionCommand(), event.getWhen(),
                    event.getModifiers());
            for (ActionListener l : listeners) {
                l.actionPerformed(e);
            }
        }
    }
}
